package es.udima.geo.geoserver.rest;

import java.util.Collection;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import es.udima.geo.geoserver.business.GpsDataController;
import es.udima.geo.geoserver.entities.GpsDataFilter;
import es.udima.geo.geoserver.entities.GpsDataRetrieveResult;
import es.udima.geo.geoserver.entities.GpsDataRetrieveResultError;
import es.udima.geo.geoserver.rest.entities.GpsDataRetrieveResponse;
import es.udima.geo.geoserver.rest.entities.IResponseError;

/**
 * <p>
 * Servicio de gestión de datos gps para los perfiles de administración del
 * servidor.
 * </p>
 * <p>
 * Este servicio no requiere autentificación de usuario. Se ha implementado sin
 * seguridad porque no era objetivo de este desarrollo hacer un servidor
 * completamente funcional, sino como apoyo a las pruebas de la implementación
 * de los clientes que usan sus servicios.
 * </p>
 * 
 * @author david
 * 
 */
@Path("/admin/gps")
public class GpsDataAdminService {

    /**
     * Constructor
     */
    public GpsDataAdminService() {
    }

    /**
     * <p>
     * Recupera los datos GPS almacenados que concuerden con las condiciones del
     * filtro pasado como parámetro.
     * </p>
     * <p>
     * El filtro debe incluir como mínimo la condición del id de usuario del que
     * se quiere recuperar los datos.
     * </p>
     * <p>
     * Si el filtro no incluye fechas se recuperarán los datos gps del último
     * día que se hayan almacenado datos de ese usuario.
     * </p>
     * 
     * @param filter
     *            Filtro con las condiciones para la recuperación de datos.
     * @return Resultado de la consulta.
     */
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public GpsDataRetrieveResponse retrieveUserGpsData(GpsDataFilter req) {

	GpsDataRetrieveResponse res = new GpsDataRetrieveResponse();

	GpsDataController gc = new GpsDataController();
	GpsDataRetrieveResult gpsRes = gc.retrieveGpsData(req);
	if (gpsRes.isSuccessful()) {
	    res.setFilter(gpsRes.getFilter());
	    res.setGpsData(gpsRes.getGpsData());
	} else {
	    res.addResponseErrors(translateGpsDataRetrieveErrors(gpsRes.getErrors()));
	}

	return res;
    }

    /*-----------------------------------------------------------------------------------------------*/

    /**
     * <p>
     * Método auxiliar para traducir los errores provenientes del controlador de
     * datos gps a errores de response manejados por los servicios rest.
     * </p>
     * 
     * @param errors
     *            Colección de errores provenientes del controlador de datos gps.
     * @return Colección de errores traducida.
     */
    private Collection<IResponseError> translateGpsDataRetrieveErrors(Collection<GpsDataRetrieveResultError> errors) {
	return new RestServiceErrorHelper().translateGpsDataRetrieveErrors(errors);
    }
}
